MongoDB

推荐列表 站点导航

当前位置:首页 > 数据库 > MongoDB >

mongoDB中聚合函数java处理示例详解

来源:互联网  作者:网友投稿  发布时间:2021-01-06 12:35
这篇文章主要给大家介绍了关于mongoDB中聚合函数java处理的相关资料,文中通过示例代码介绍的非常详细,对大家学习...

一开始考虑到直接对mongoDB中的属性排序,后面发现属性存在内嵌文档中,所以处理中需要用到聚合函数。

思考

(key)解决这个问题的过程让我学到很多,发现自己在解决一个问题不仅查找问题的姿势不对,浪费太多时间。而且在碰到问题之后,应该多看看解决办法,甚至解决了之后要去思考问题,回顾问题。而不是像以前一样,解决问题了就万事大吉,抛之脑后。

2.解决

需要对document中的一个tweet_list 集合中的一个属性 timestamp_ms进行排序。 组内排序

使用聚合框架,通过match,unwind,sort等不同的组件创建一个管道。

类似mysql中的多层嵌套子查询。

mongoDB中js代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

 

db.text.aggregate(

 // Initial document match (uses index, if a suitable one is available)

 [

 { $match: {

  _id : ObjectId("5ca95b4bfb60ec43b5dd0db5")

 }},

 

 // Expand the scores array into a stream of documents

 { $unwind: '$tweet_list' },

  

  { $match: {

   'tweet_list.timestamp_ms': '1451841845660'

  }},

 

 // Sort in descending order

 { $sort: {

  'tweet_list.timestamp_ms': 1

 }}

 ]

)

 

java实现此聚合函数

java中的Aggregation类,查询条件的顺序决定结果。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

Aggregation agg = Aggregation.newAggregation(

  Aggregation.match(Criteria.where("_id").is(id)),

  Aggregation.unwind("tweet_list"),

  Aggregation.sort(Sort.Direction.ASC,"tweet_list.timestamp_ms"),

  Aggregation.project("tweet_list.timestamp_ms","tweet_list.text","tweet_list.created_at")

 

);

AggregationResults<JSONObject> results = mongoTemplate.aggregate(agg, "text", JSONObject.class);

//System.out.println("results"+results.getRawResults()); //获取到的结果是document

//String res = results.getRawResults();

String json = com.mongodb.util.JSON.serialize(results.getRawResults());

System.out.println("JSON serialized Document: " + json);

JSONObject jso= JSON.parseObject(json);

JSONArray resultss=jso.getJSONArray("results");

System.out.println(resultss);

 

3.扩展

管道pipeline

以下的管道操作符可以按照任意顺序组合在一起使用。每个操作符都会接受一连串文档,对这些文档做了类型转换后,将转换后的文档作为结果传递给下一个操作符。直到最后一个管道操作符,将结果返回给客户端。

筛选match

尽可能将帅选放在管道的前部。两个原因:

1.先过滤掉不需要的文档,减少管道的工作量。

2.如果在project和group之前执行match,查询可以用索引。

3.不能在match中使用地理空间操作符

投射project

类似select操作。可以用管道表达式,数学表达式,日期表达式,字符表达式,逻辑表达式等。

分组group

跟mysql中的分组比较像

排序sort

1 升序 -1 降序

限制limit

限制结果条数

跳过skip

丢弃结果中的前n个文档

拆分unwind

把数组中的每个值拆分为单独的文档,例如此问题中需要对一个document中的tweetlist进行排序,可以使用unwind把tweetlist中的不同map拆分成不同的文档。

结果返回

文档

mongoDB中聚合函数java处理示例详解

MapReduce

如果聚合框架中查询语言不能不表达,需要用到MapReduce。

使用:把问题拆分为多个小问题,把各个小问题发送到不同的机器上,每台机器只负责完成一部分的工作,完成之后,再把零碎的解决方案合并。

步骤:

1.映射map:把操作映射到集合中每个文档

2.洗牌shuffle:按照键值分组,并将产生的键值组成列表放到对应的键中。

3.化简reduce:把列表中的值化简成一个单值,值被返回,继续shuffle,然后最终每个键的列表只有一个值,即最终结果,

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/sql/mogodb/11466.shtml

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

mongoDB中聚合函数java处理示例详解

2021-01-06 编辑:网友投稿

一开始考虑到直接对mongoDB中的属性排序,后面发现属性存在内嵌文档中,所以处理中需要用到聚合函数。

思考

(key)解决这个问题的过程让我学到很多,发现自己在解决一个问题不仅查找问题的姿势不对,浪费太多时间。而且在碰到问题之后,应该多看看解决办法,甚至解决了之后要去思考问题,回顾问题。而不是像以前一样,解决问题了就万事大吉,抛之脑后。

2.解决

需要对document中的一个tweet_list 集合中的一个属性 timestamp_ms进行排序。 组内排序

使用聚合框架,通过match,unwind,sort等不同的组件创建一个管道。

类似mysql中的多层嵌套子查询。

mongoDB中js代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

 

db.text.aggregate(

 // Initial document match (uses index, if a suitable one is available)

 [

 { $match: {

  _id : ObjectId("5ca95b4bfb60ec43b5dd0db5")

 }},

 

 // Expand the scores array into a stream of documents

 { $unwind: '$tweet_list' },

  

  { $match: {

   'tweet_list.timestamp_ms': '1451841845660'

  }},

 

 // Sort in descending order

 { $sort: {

  'tweet_list.timestamp_ms': 1

 }}

 ]

)

 

java实现此聚合函数

java中的Aggregation类,查询条件的顺序决定结果。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

Aggregation agg = Aggregation.newAggregation(

  Aggregation.match(Criteria.where("_id").is(id)),

  Aggregation.unwind("tweet_list"),

  Aggregation.sort(Sort.Direction.ASC,"tweet_list.timestamp_ms"),

  Aggregation.project("tweet_list.timestamp_ms","tweet_list.text","tweet_list.created_at")

 

);

AggregationResults<JSONObject> results = mongoTemplate.aggregate(agg, "text", JSONObject.class);

//System.out.println("results"+results.getRawResults()); //获取到的结果是document

//String res = results.getRawResults();

String json = com.mongodb.util.JSON.serialize(results.getRawResults());

System.out.println("JSON serialized Document: " + json);

JSONObject jso= JSON.parseObject(json);

JSONArray resultss=jso.getJSONArray("results");

System.out.println(resultss);

 

3.扩展

管道pipeline

以下的管道操作符可以按照任意顺序组合在一起使用。每个操作符都会接受一连串文档,对这些文档做了类型转换后,将转换后的文档作为结果传递给下一个操作符。直到最后一个管道操作符,将结果返回给客户端。

筛选match

尽可能将帅选放在管道的前部。两个原因:

1.先过滤掉不需要的文档,减少管道的工作量。

2.如果在project和group之前执行match,查询可以用索引。

3.不能在match中使用地理空间操作符

投射project

类似select操作。可以用管道表达式,数学表达式,日期表达式,字符表达式,逻辑表达式等。

分组group

跟mysql中的分组比较像

排序sort

1 升序 -1 降序

限制limit

限制结果条数

跳过skip

丢弃结果中的前n个文档

拆分unwind

把数组中的每个值拆分为单独的文档,例如此问题中需要对一个document中的tweetlist进行排序,可以使用unwind把tweetlist中的不同map拆分成不同的文档。

结果返回

文档

mongoDB中聚合函数java处理示例详解

MapReduce

如果聚合框架中查询语言不能不表达,需要用到MapReduce。

使用:把问题拆分为多个小问题,把各个小问题发送到不同的机器上,每台机器只负责完成一部分的工作,完成之后,再把零碎的解决方案合并。

步骤:

1.映射map:把操作映射到集合中每个文档

2.洗牌shuffle:按照键值分组,并将产生的键值组成列表放到对应的键中。

3.化简reduce:把列表中的值化简成一个单值,值被返回,继续shuffle,然后最终每个键的列表只有一个值,即最终结果,

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/sql/mogodb/11466.shtml

相关文章

风云图片

推荐阅读

返回MongoDB频道首页